package com.codeplatform.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;

/**
 * 代码记录实体类
 * 
 * @author CodePlatform
 * @since 2024-01-01
 */
@TableName("code_records")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CodeRecord {

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 代码片段标题
     */
    @TableField("title")
    private String title;

    /**
     * 编程语言
     */
    @TableField("language")
    private String language;

    /**
     * 源代码
     */
    @TableField("code")
    private String code;

    /**
     * 输入数据
     */
    @TableField("input_data")
    private String inputData;

    /**
     * 执行输出
     */
    @TableField("output")
    private String output;

    /**
     * 错误信息
     */
    @TableField("error_message")
    private String errorMessage;

    /**
     * 执行耗时(毫秒)
     */
    @TableField("execution_time")
    private Integer executionTime;

    /**
     * 内存使用(KB)
     */
    @TableField("memory_usage")
    private Integer memoryUsage;

    /**
     * 执行状态：0-未执行，1-成功，2-失败，3-超时
     */
    @TableField("execution_status")
    @Builder.Default
    private Integer executionStatus = 0;

    /**
     * 是否公开
     */
    @TableField("is_public")
    @Builder.Default
    private Boolean isPublic = false;

    /**
     * 分享令牌
     */
    @TableField("share_token")
    private String shareToken;

    /**
     * 是否允许编辑(分享时)
     */
    @TableField("allow_edit")
    @Builder.Default
    private Boolean allowEdit = false;

    /**
     * 分享时间
     */
    @TableField("shared_at")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime sharedAt;

    /**
     * 执行次数
     */
    @TableField("execution_count")
    @Builder.Default
    private Integer executionCount = 0;

    /**
     * 查看次数
     */
    @TableField("view_count")
    @Builder.Default
    private Integer viewCount = 0;

    /**
     * 创建时间
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;



    /**
     * 增加执行次数
     */
    public void incrementExecutionCount() {
        this.executionCount = (this.executionCount == null ? 0 : this.executionCount) + 1;
    }

    /**
     * 增加查看次数
     */
    public void incrementViewCount() {
        this.viewCount = (this.viewCount == null ? 0 : this.viewCount) + 1;
    }

    /**
     * 检查是否为所有者
     */
    public boolean isOwner(Long userId) {
        return this.userId != null && this.userId.equals(userId);
    }

    /**
     * 检查是否可以访问
     */
    public boolean canAccess(Long userId) {
        return isOwner(userId) || this.isPublic;
    }

    /**
     * 检查是否可以编辑
     */
    public boolean canEdit(Long userId) {
        return isOwner(userId) || (this.isPublic && this.allowEdit);
    }

    /**
     * 生成分享URL
     */
    public String getShareUrl(String baseUrl) {
        if (this.shareToken == null) {
            return null;
        }
        return baseUrl + "/share/" + this.shareToken;
    }

    // 手动添加缺失的getter方法以解决编译问题
    public Long getUserId() {
        return userId;
    }

    public Boolean getIsPublic() {
        return isPublic;
    }
}